package util;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import java.io.IOException;
import java.io.InputStream;

/**
 * 本类用来演示: mybatis工具类 - SqlSession = Connection + Cache[一级缓存]
 *
 * @author: success
 * @date: 2022/10/22 9:35 上午
 */
public class MybatisUtil {
    //SqlSessionFactory - "数据源的工厂" - 重量级的对象
    //创建和销毁的时间很长,并且这个对象比较吃内存.
    //因此这种对象在内存中应该只有一份实例 - 所以此处使用static进行修饰,当然可以设置成单例的设计模式

    //static修饰的成员,在jvm加载的时候,就会立即分配空间以及初始化,并且在内存中的实例永远只有一个.
    private static SqlSessionFactory sqlSessionFactory = null;

    //静态代码块 - 只会执行一次 - 执行一些比较费时间的工作 - 读取配置文件
    static{
        //mybatis-config.xml文件必须要放入到src/main/resources目录下
        String resource = "mybatis-config.xml";
        InputStream inputStream = null;
        try {
            inputStream = Resources.getResourceAsStream(resource);
        } catch (IOException e) {
            e.printStackTrace();
        }
        sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
    }

    //提供一个对外公开的方法,来获取每次的连接
    //和db进行连接
    public static SqlSession getSqlSession(){
        return sqlSessionFactory.openSession();
    }

    //释放连接 - 释放内存
    //public static void close(SqlSession sqlSession){
    //    if(null!=sqlSession){
    //        sqlSession.close();
    //    }
    //}
}